/*
 * 上海远境文化传媒有限公司 版权所有
 */
package controllers.api.v1;

import cache.CacheHelper;
import ext.auth.UserAuthHelper;
import facade.AppContext;
import facade.base.AdminUserFacade;
import facade.base.EntityLogFacade;
import facade.open.BaseJsonAPI;
import facade.open.request.LoginRequest;
import facade.vo.base.LoginUserVO;
import helper.GlobalConfig;
import helper.constants.SessionName;
import models.base.AdminUser;
import models.enums.AvailableStatus;
import models.enums.OpenIdSource;
import org.apache.commons.lang.StringUtils;
import play.Logger;
import play.libs.Codec;
import util.play.RequestUtility;

import java.util.Map;

/**
 * 用户登录与注销接口.
 */
public class SessionsAPI extends BaseJsonAPI {

    /**
     * 用户名密码登录方式.
     */
    public static void login() {

        LoginRequest loginRequest = parseRequestBody(LoginRequest.class);
        Logger.info("loginRequest : %s  | %s" , loginRequest.login , loginRequest.password);
        // 原登录验证
//        AdminUser user = CorpUserFacade.checkForLogin(null, loginRequest.login, loginRequest.password);
//
//        if (user != null) {
//            EntityLogFacade.log(user.id, user, AppContext.getClientType(), "接口密码登录");
//            storeUserIntoSession(user);
//        }

        //新登录验证
        AdminUser adminUser = AdminUserFacade.checkForLogin(loginRequest.login , loginRequest.password);
        if (adminUser != null) {
            if(adminUser.status == AvailableStatus.FREEZE){
                renderWarnMessage(401, "用户已被禁用，请联系管理员");
            }

            EntityLogFacade.log(adminUser.id, adminUser, AppContext.getClientType(), "账号密码登录");
            storeUserIntoSession2(adminUser);
        }

        renderWarnMessage(401, "无效的用户或密码");
    }

    //新登录验证,只有密码的验证，没有其他的关联
    private static void storeUserIntoSession2(AdminUser user) {
        String sessionId = UserAuthHelper.storeUserIdWithSessionId(user, OpenIdSource.PASSWORD);

        // 设置CSRF cookie
        //UserAuthHelper.setupCsrfCookie(sessionId);
        //session.put(SessionName.SESSION_USER_KEY, user.id);  // Web版Session

        Map<String, Object> configMap = AdminUserFacade.getUserConfig(user);
        configMap.put("session", sessionId);
        configMap.put("user", LoginUserVO.from(user));
        renderData(configMap);
    }




    public static void logout() {
        session.remove(SessionName.SESSION_USER_KEY);  // Web版Session

        // 禁用sessionId使用。
        // 按x-hyshi-session读取sessionId
        String sessionId = RequestUtility.getHeaderIgnoreCase(GlobalConfig.API_HEADER_SESSION);
        if (StringUtils.isNotBlank(sessionId)) {
            CacheHelper.setCache(Codec.hexMD5(sessionId), "1"); //设置24小时内不能使用此sessionId登录
        }

        AppContext.cleanUp();
        renderSuccMessage("注销成功");
    }

}
